package com.mes.schedule.manager.iface;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Date;
import java.util.List;
import java.util.TreeSet;

import com.mes.basicdata.domain.CalendarData;
import com.mes.schedule.domain.OperationTasksAssign;
import com.mes.schedule.domain.SCalendar;
import com.mes.schedule.domain.SDevice;
import com.mes.schedule.domain.SOperationTask;
import com.mes.schedule.domain.ScheduleScheme;

/*import com.mes.basicdata.persistence.domain.CalendarData;
import com.mes.schedule.persistence.domain.OperationTasksAssign;
import com.mes.schedule.persistence.domain.SCalendar;
import com.mes.schedule.persistence.domain.SDevice;
import com.mes.schedule.persistence.domain.SOperationTask;
import com.mes.schedule.persistence.domain.ScheduleScheme;*/

public interface IScheduleDeviceManager extends IScheduleResourceManager {

	/**
	 * calculate the load ration of the device
	 * 
	 * @param device
	 * @param scheme
	 */
	public void calDeviceStatistics(SDevice device, ScheduleScheme scheme);

	/**
	 * calculate the total wait time of the task waiting before the device
	 * 
	 * @param device
	 * @param scheme
	 */
	public void calcWaitTime(SDevice device, ScheduleScheme scheme);

	/**
	 * 更新设备日历信息 包括设备基准日历信息，每周工作时间定义，例外日历信息
	 */
	public void updateDeviceCalendar(String scheduleUid, String deviceUid,
			SCalendar calendar, List<CalendarData> calendarDataList)
			throws Exception;

	/**
	 * 保存日历例外
	 */
	public void saveDeviceException(SDevice device, ScheduleScheme scheme,
			List<CalendarData> calendarDataList) throws Exception;

	/**
	 * 获得设备本身的例外信息，去掉基准日历之外
	 */
	public List<CalendarData> getDeviceException(SDevice device,
			ScheduleScheme scheme) throws Exception;

	/**
	 * 重新初始化日历信息
	 */
	// public void initDevice(Device device) throws Exception;
	/**
	 * 获取设备列表，按照优先级排序
	 */

	public TreeSet<SDevice> getDevicesOrderByCritical(ScheduleScheme scheme);

	/**
	 * 将工序任务operationTask预分配到device中
	 * 
	 * @param device
	 * @param operationTask
	 */
	public void preassignTask(SDevice device, SOperationTask operationTask);

	/**
	 * 取得设备一段时间的可用时间段数
	 * 
	 * @param device
	 * @param fromDate
	 * @param toDate
	 * @return
	 */
	public int getAvailableSegementCount(SDevice device, Date fromDate,
			Date toDate);

	/**
	 * 取得设备一段时间的可用时间段数 计算设备在考虑日历的情况下，从starttime起，需要estiTaskWork分钟的 结束时间
	 * 
	 * @param device
	 * @param startTime
	 * @param estiTaskWork
	 * @return
	 */

	public Date calFinishTime(SDevice device, Date startTime,
			double estiTaskWork);

	/**
	 * 计算设备在考虑日历的情况下，从startSegement起，需要estiTaskWork分钟的 结束时间段
	 * 
	 * @param device
	 * @param startSegement
	 * @param estiTaskWork
	 * @return
	 */

	public int calFinishSegement(SDevice device, int startSegement,
			double estiTaskWork);

	/**
	 * 开始维修
	 */
	public void beginMaint(SDevice device, Date planResumeTime)
			throws Exception;

	/**
	 * 维修完成
	 */
	public void recoveryMaint(SDevice device) throws Exception;

	/**
	 * 计算设备在某一时间之前的总能力
	 */
	public int calCapacity(SDevice device, Date beforeDate);

	/**
	 * 计算设备在某一时间之前的必须要做的任务 由里程碑，零件交货期等决定
	 */
	public List<SOperationTask> getMustDoList(SDevice device, Date beforeDate);

	/**
	 * 计算设备在某一时间之前的必须要做的任务 由里程碑，零件交货期等决定 工序距离小于maxTaskInstance
	 */
	public List<SOperationTask> getMustDoList(SDevice device, Date beforeDate,
			String drawingId, Integer maxTaskInstance);

	/**
	 * 计算设备在某一时间之前的必须要做的任务 由里程碑，零件交货期等决定
	 */
	public List<SOperationTask> getMaybeDoList(SDevice device, Date beforeDate);

	/**
	 * 计算设备在某一时间之外的可能要做的任务 工序距离小于maxTaskInstance
	 */
	public List<SOperationTask> getMaybeDoList(SDevice device, Date afterDate,
			String drawingId, Integer maxTaskInstance);

	/**
	 * 获得设备列表
	 * 
	 * @param scheduleUid
	 * @return
	 * @throws Exception
	 */
	public List<SDevice> getDeviceList(ScheduleScheme scheme) throws Exception;

	/**
	 * fpc 根据工序号和调度方案得到可分配的设备上工序任务数量、负荷、能力等
	 */
	public List<OperationTasksAssign> getOperationTaskAssignedToDeviceList(
			String scheduleUid, String opTaskUid) throws Exception;

	/**
	 * 获取部门下的设备 hba
	 * 
	 * @param deptId
	 * @return
	 */
	public List<SDevice> getDeviceList(String deptId);

	public void updateDeviceCalendar(SDevice device, SCalendar calendar)throws Exception;

}
